home *** CD-ROM | disk | FTP | other *** search
/ Amiga CD32 Gamer 22 / CD32 Gamer - 1996 - Issue 22.iso / fli / src / c2p_akiko.s < prev    next >
Text File  |  1995-01-05  |  2KB  |  99 lines

  1. ;void __asm c2p_akiko (register __a0 UBYTE *chunky_data,
  2. ;                      register __a1 PLANEPTR raster,
  3. ;                      register __a2 UBYTE *dirty_list,
  4. ;                      register __d1 ULONG plsiz,
  5. ;                      register __a5 UBYTE *akiko_address);
  6.  
  7. ; a0 -> width*height chunky pixels in fastmem
  8. ; a1 -> contiguous bitplanes in chipmem
  9. ; a2 -> dirty list (1-byte flag for whether each 32 pixel "unit" needs updating)
  10. ; d1 = width*height/8   (width*height must be a multiple of 32)
  11.  
  12.     ifeq    depth-8
  13.         xdef    _c2p_8_akiko
  14. _c2p_8_akiko:
  15.     else
  16.     ifeq    depth-6
  17.         xdef    _c2p_6_akiko
  18. _c2p_6_akiko:
  19.     else
  20.     ifeq    depth-4
  21.         xdef    _c2p_4_akiko
  22. _c2p_4_akiko:
  23.     else
  24.         fail    "unsupported depth!"
  25.     endc
  26.     endc
  27.     endc
  28.  
  29.         xref    _GfxBase
  30.  
  31.         movem.l    a2/a3/a6,-(sp)
  32.  
  33.         move.l    d1,d0        ; plsiz
  34.         lsl.l    #3,d0        ; 8*plsiz
  35.         lea    (a0,d0.l),a3    ; a3 -> end of chunky data
  36.         sub.l    d1,d0        ; d0 = 7*plsiz
  37.     ifle depth-6
  38.         sub.l    d1,d0
  39.         sub.l    d1,d0        ; d0 = 5*plsiz if depth=6
  40.     ifle depth-4
  41.         sub.l    d1,d0
  42.         sub.l    d1,d0        ; d0 = 3*plsiz if depth=4
  43.     endc
  44.     endc
  45.  
  46.         movem.l    d0/d1/a0/a1,-(sp)
  47.         movea.l    (_GfxBase).l,a6
  48.         jsr    (_LVOOwnBlitter,a6) ; gain exclusive use of Akiko
  49.         movem.l    (sp)+,d0/d1/a0/a1
  50.  
  51. loop:        tst.b    (a2)+        ; does next 32 pixel unit need updating?
  52.         bne.b    c2p        ; branch if yes
  53.  
  54.         adda.w    #32,a0        ; skip 32 pixels on input
  55.         addq.l    #4,a1        ; skip 32 pixels on output
  56.  
  57.         cmpa.l    a3,a0
  58.         bne.b    loop
  59.         bra.b    exit        ; exit if no changes
  60.  
  61. c2p:        move.l    (a0)+,(a5)    ; write 32 pixels to akiko
  62.         move.l    (a0)+,(a5)
  63.         move.l    (a0)+,(a5)
  64.         move.l    (a0)+,(a5)
  65.         move.l    (a0)+,(a5)
  66.         move.l    (a0)+,(a5)
  67.         move.l    (a0)+,(a5)
  68.         move.l    (a0)+,(a5)
  69.  
  70.         move.l    (a5),(a1)    ; plane 0
  71.         adda.l    d1,a1
  72.         move.l    (a5),(a1)    ; plane 1
  73.         adda.l    d1,a1
  74.         move.l    (a5),(a1)    ; plane 2
  75.         adda.l    d1,a1
  76.     ifgt depth-4
  77.         move.l    (a5),(a1)    ; plane 3
  78.         adda.l    d1,a1
  79.         move.l    (a5),(a1)    ; plane 4
  80.         adda.l    d1,a1
  81.     ifgt depth-6
  82.         move.l    (a5),(a1)    ; plane 5
  83.         adda.l    d1,a1
  84.         move.l    (a5),(a1)    ; plane 6
  85.         adda.l    d1,a1
  86.     endc
  87.     endc
  88.         move.l    (a5),(a1)+    ; last plane
  89.  
  90.         suba.l    d0,a1        ; -7*plsiz (or 5*plsiz) (or 3*plsiz)
  91.  
  92.         cmpa.l    a3,a0
  93.         bne.b    loop
  94.  
  95. exit:        jsr    (_LVODisownBlitter,a6) ; free Akiko
  96.  
  97.         movem.l    (sp)+,a2/a3/a6
  98.         rts
  99.